Skip to content
← 返回技术文章FIELD NOTE / 2024
FIELD NOTE · DOIT / LOG

记录一次 Docker 部署目标服务器脚本

编写自动化部署脚本,实现 SSH 密钥认证免密登录、Docker 镜像版本自动管理、自动构建并推送到镜像仓库、Git tag 标记版本、打包上传部署文件到目标服务器的一整套流程。适用于团队内部使用和 CI/CD 集成。

PUBLISHED2024-01-29
READING TIME3 MIN
CATEGORY技术文章
SCROLL TO READ

记录一次 Docker 部署目标服务器脚本 ​

背景: ​

上篇记录了一个项目中的 Docker 服务部署流程,但是实际使用中肯定不够方便,需要记住服务器密码、构建、部署等,流程,还是挺繁杂。

于是写了一个部署脚本,方便团队内部使用以及集成 CI/CD 等。

主要流程: ​

  1. 配置 SSH 密钥认证
  2. 自动管理 Docker 镜像版本号
  3. 构建 Docker 镜像
  4. Git tag
  5. 打包上传到目标服务器
  6. 目标服务器加载 Docker 镜像
  7. 部署 Docker 镜像

SSH 密钥认证 ​

使用 ssh 密钥认证方式可以自动认证登录目标服务器,避免手动输入登录密码,也可避免密码的滥用。

  1. 生成 ssh 密钥对:
bash
ssh-keygen -t rsa

如果本机已有 rsa 密钥,继续下一步 (下面命令进行查看)

bash
cd ~/.ssh
# 查看目录下文件
ls
  1. 将公钥上传到目标服务器

i:指定公钥文件

bash
ssh-copy-id -i ~/.ssh/id_rsa.pub user@host
  1. 上传成功后,就可以不需要使用密码登录目标服务器
bash
ssh user@host

treeder/bump ​

主要用于在项目构建和发布流程中管理版本号,可以自动递增版本号。

  • 主要的版本号(major)
  • 次要的版本号(minor)
  • 修订版本号(patch)
bash
# 使用 treeder/bump 增加修订版本号
docker run --rm -v "$PWD":/app treeder/bump patch

# 读取新的版本号
version=$(cat VERSION)
echo "New version: $version"

# 接下来,你可以在构建、发布等过程中使用新的版本号
# 例如,更新 Docker 镜像的版本标签、发布新版本等

在上述例子中,treeder/bump patch 表示增加修订版本号。你还可以使用 minor 或 major 代替 patch,分别表示增加次要版本号和主要版本号

Git Tag ​

对构建的 Docker 项目进行打标签,可以更好地管理和维护代码库的版本历史,提高代码库的可读性和可维护性,同时为版本发布提供了便捷的方式

如下,对当前的源码版本创建 v1.0.0 标签:

bash
# 创建轻量标签(Lightweight Tag)
git tag v1.0.0

# 创建附注标签(Annotated Tag),可以添加注释
git tag -a v1.0.0 -m "Release version 1.0.0"

# 推送所有标签到远程仓库
git push --tags

完整脚本 ​

脚本中其他使用方法在上篇进行了说明

Click me to view the code
bash
#!/bin/bash

# 调试模式
set -ex

# 远程服务器登录信息
remote_host=$1
remote_port=${2:-2333}

# 检查参数个数
if [ "$#" -le 0 ]; then
    echo Error: 请输入账户以及密码参数
    exit 1
fi

# 远程打包的目录
REMOTE_DIR=images/

# 镜像名称
PREFIX=docker.iflydocs.com
IMAGE=clash-of-llm

# 使用 treeder/bump 自增版本号
docker run --rm -v "$PWD":/app treeder/bump patch
version=`cat VERSION`

# 构建镜像
docker build -t $PREFIX/$IMAGE:latest -t $PREFIX/$IMAGE:$version .

# 推送镜像到 git 仓库
git tag -a "v$version" -m "docker image version $version"
git push --tags

# 推送镜像到 docker 仓库
# TODO

# 打包镜像并上传到服务器
docker save -o ./$IMAGE-$version.tar $PREFIX/$IMAGE:$version
scp ./$IMAGE-$version.tar $remote_host:/root/$REMOTE_DIR

# 删除压缩文件
rm ./$IMAGE-$version.tar

# 使用 ssh 连接到远程服务器
ssh "$remote_host" << EOF

  # 加载镜像压缩文件
  docker load -i $REMOTE_DIR/$IMAGE-$version.tar

  # tag
  docker tag $PREFIX/$IMAGE:$version $PREFIX/$IMAGE:latest
  # 停止并删除 clash-of-llm
  docker stop $IMAGE && docker rm $IMAGE
  # 重启 clash-of-llm
  docker run --name $IMAGE -p $remote_port:3000 -d -v /root/logs:/usr/src/app/logs --restart always $PREFIX/$IMAGE

  # 删除镜像压缩文件
  rm $REMOTE_DIR/$IMAGE-$version.tar

EOF

使用:

bash
# 默认端口号 2333
sh deploy.sh user@host

# 指定端口号
sh deploy.sh user@host port

# e.g.
sh deploy.sh [email protected] 8000

BUILT WITH CURIOSITY · RELEASED UNDER MIT